package com.kwt.learn.map;

/**
 * 测试hash 函数
 */
public class HashFunction01 {
    public static void main(String[] args) {
        String key = "nihao";
        int keyHashCode = key.hashCode();
        int keyHashFunction = keyHashCode ^ (keyHashCode >>> 16);


        System.out.println("keyHashCode:" + keyHashCode);
        System.out.println("keyHashFunction:" + keyHashFunction);

        System.out.println("keyHashCode Binary    :" + Integer.toBinaryString(keyHashCode));
        System.out.println("keyHashFunction Binary:" + Integer.toBinaryString(keyHashFunction));

        System.out.println("………………………………………………………………………………………………………………………………");

        System.out.println("keyHashCode & (n-1) :" + (keyHashCode & 15));
        System.out.println("keyHashCode % n     :" + (keyHashCode % 16));

        System.out.println("keyHashFunction & (n-1) :" + (keyHashFunction & 15));
        System.out.println("keyHashFunction  % n    :" + keyHashFunction % 16);

        /**
         * 由以上代码得知，如果key的hashCode值不与本身右移16位后做异或运算 最终使用hash值数组寻址时得到的数组下标识不一样的
         *
         *
         1、分析hash函数中为什么要无符号右移16位
         keyHashCode:104818427
         keyHashFunction:104816836

         keyHashCode Binary    :0000 0110 0011 1111 0110 0110 1111 1011
         keyHashFunction Binary:0000 0110 0011 1111 0110 0000 1100 0100
         *
         * 可以看到右移十六位计算得到的结果和计算之前的区别是后边四位数字发生了变化
         * 其实在后续计算中，使用hash函数的结果对 n 取模运算（对n-1为&运算），影响结果的还是低位，所以单纯的使用hashCode去参与数组寻址，
         * hashCode中的高16位基本是没有起到作用的，所以需要做一个右移16位的操作
         */
    }
}
